home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xarchie-2.0.9 / popups.c < prev    next >
C/C++ Source or Header  |  1995-06-18  |  4KB  |  153 lines

  1. /*
  2.  * popups.c : Generic blocking popup routines
  3.  *
  4.  * George Ferguson, ferguson@cs.rochester.edu, 23 Apr 1993.
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <X11/Intrinsic.h>
  9. #include <X11/StringDefs.h>
  10. #include <X11/Shell.h>
  11. #include <X11/Xaw/Dialog.h>
  12. extern Widget toplevel;        /* this is the only external */
  13.  
  14. /*
  15.  * Functions defined here:
  16.  */
  17. Widget createPopup();                /* Generic popup routines */
  18. void setPopupLabel();
  19. void popupMainLoop();
  20. void popupDone();                /* Call this when done */
  21.  
  22. static void centerWidgetAndMouse();
  23.  
  24. /*
  25.  * Data defined here:
  26.  */
  27. static int popupIsDone;
  28.  
  29. /*    -    -    -    -    -    -    -    -    */
  30.  
  31. Widget
  32. createPopup(basename,num_buttons,callback)
  33. char *basename;
  34. int num_buttons;
  35. XtCallbackProc callback;
  36. {
  37.     Widget shell,dialog;
  38.     char name[256];
  39.     int i;
  40.  
  41.     sprintf(name,"%sShell",basename);
  42.     shell = XtCreatePopupShell(name,transientShellWidgetClass,toplevel,NULL,0);
  43.     sprintf(name,"%sDialog",basename);
  44.     dialog = XtCreateManagedWidget(name,dialogWidgetClass,shell,NULL,0);
  45.     for (i=0; i < num_buttons; i++) {
  46.     sprintf(name,"%sButton%d",basename,i);
  47.     XawDialogAddButton(dialog,name,callback,(XtPointer)i);
  48.     }
  49.     XtRealizeWidget(shell);
  50.     return(shell);
  51. }
  52.  
  53. void
  54. setPopupLabel(w,basename,str)
  55. Widget w;
  56. char *basename,*str;
  57. {
  58.     char name[256];
  59.     Widget dialog;
  60.     Arg args[1];
  61.  
  62.     sprintf(name,"%sDialog",basename);
  63.     dialog = XtNameToWidget(w,name);
  64.     XtSetArg(args[0],XtNlabel,str);
  65.     XtSetValues(dialog,args,1);
  66. }
  67.  
  68. /*
  69.  * Popup "shell" with an exclusive grab, then dispatch events until
  70.  * popupDone becomes True, then pop "shell" down.
  71.  */
  72. void
  73. popupMainLoop(shell)
  74. Widget shell;
  75. {
  76.     /* Go synchronous or the widgets don't resize properly */
  77.     XSynchronize(XtDisplay(toplevel),True);
  78.     /* Center the popup */
  79.     centerWidgetAndMouse(shell,toplevel,shell);
  80.     /* Beep */
  81.     XBell(XtDisplay(toplevel),0);
  82.     /* Pop it up and block until one of the buttons is clicked */
  83.     popupIsDone = 0;
  84.     XtPopup(shell,XtGrabExclusive);
  85.     while (!popupIsDone) {
  86.     /*
  87.      * Only dispatch XEvents since we don't want input events or
  88.      * timers to get in the way
  89.      */
  90.     XtAppProcessEvent(XtWidgetToApplicationContext(toplevel),XtIMXEvent);
  91.     }
  92.     /* Okay, pop it down */
  93.     XtPopdown(shell);
  94. #ifndef DEBUG
  95.     /* Back to normal */
  96.     XSynchronize(XtDisplay(toplevel),False);
  97. #endif
  98. }
  99.  
  100. void
  101. popupDone()
  102. {
  103.     popupIsDone = 1;
  104. }
  105.  
  106. /*    -    -    -    -    -    -    -    -    */
  107. /*
  108.  * Center widget "widget" inside widget "pwidget" and warp mouse to middle
  109.  * of "mwidget".
  110.  */
  111. static void
  112. centerWidgetAndMouse(widget,pwidget,mwidget)
  113. Widget widget,pwidget,mwidget;
  114. {
  115.     Arg args[2];
  116.     Window rwin,child;
  117.     int x,y,px,py;
  118.     unsigned int w,h,pw,ph,bw,d;
  119.  
  120.     /* Get child size */
  121.     XGetGeometry(XtDisplay(widget),XtWindow(widget),
  122.          &rwin,&x,&y,&w,&h,&bw,&d);
  123.     /* Get parent size, position */
  124.     XGetGeometry(XtDisplay(pwidget),XtWindow(pwidget),
  125.          &rwin,&px,&py,&pw,&ph,&bw,&d);
  126.     /* Need position in root window coords, don't ask me why */
  127.     XTranslateCoordinates(XtDisplay(widget),XtWindow(pwidget),rwin,
  128.               px,py,&x,&y,&child);
  129.     px = x;
  130.     py = y;
  131.     /* Compute child position */
  132.     x = px + pw/2 - w/2;
  133.     if (x < 0)
  134.     x = 0;
  135.     else if (x > WidthOfScreen(XtScreen(widget))-w)
  136.     x = WidthOfScreen(XtScreen(widget))-w;
  137.     y = py + ph/2 - h/2;
  138.     if (y < 0)
  139.     y = 0;
  140.     else if (y > HeightOfScreen(XtScreen(widget))-h)
  141.     y = WidthOfScreen(XtScreen(widget))-h;
  142.     /* Set child position */
  143.     XtSetArg(args[0],XtNx,x);
  144.     XtSetArg(args[1],XtNy,y);
  145.     XtSetValues(widget,args,2);
  146.     /* Get dest size, position */
  147.     XGetGeometry(XtDisplay(mwidget),XtWindow(mwidget),
  148.          &rwin,&x,&y,&w,&h,&bw,&d);
  149.     /* Move mouse there */
  150.     XWarpPointer(XtDisplay(mwidget),None,XtWindow(mwidget),
  151.          0,0,0,0,w/2,h/2);
  152. }
  153.